DEFINITION MODULE Code; (* Leo & Ned  15-Nov-85 *)

(*********************************************************************)
(*********************************************************************)
(**                                                                 **)
(**                         K  R  O  N  O  S                        **)
(** (c) 1985,1986,1987      ~~~~~~~~~~~~~~~~    INDEX 654-325-32.01 **)
(**                             SoftWare                            **)
(**                             FirmWare                            **)
(**                             HardWare                            **)
(**                                                                 **)
(**                                                                 **)
(**       Личная  собственность группы  "КРОНОС":                   **)
(**               Тарасов  Евгений   Викторович  (Sem)              **)
(**               Кузнецов Дмитрий   Николаевич  (Leo)              **)
(**               Недоря   Алексей   Евгеньевич  (Ned)              **)
(**               Филиппов Владимир  Эдуардович  (Fil)              **)
(**               Осипов   Александр Евгеньевич  (Shu)              **)
(**                                                                 **)
(**                                     Telex: KRONOS-2-12-85-06    **)
(**                                                                 **)
(*********************************************************************)
(*********************************************************************)


FROM SYSTEM    IMPORT   ADDRESS, WORD;

CONST NoCatrs=16; CurrentVersion = 100h;
 
(* Модуль призван скрыть от разработчиков компиляторов,
   загрузчиков и комплексаторов конкретное устройство кодофайла.
       В его терминах кодофайл - это непрерывная область памяти,
   указатель на которую и является значением типа "Code".
   Чтение и запись этой области памяти на внешние носители не
   входит в задачи этого модуля и обеспечивается внешним образом.
       В начале кодофайла располагается область атрибутов кодофайла
   размером -noCatrs- слов. Расположение остальных областей кодофайла
   не фиксируется и может быть различным для разных компиляторов.
   Рекомендуемый порядок:
      <атрибуты> <строковый пул> <код> <внешние связи> <...остальное...>
   Первой строкой в <строковом пуле> ДОЛЖНО лежать имя модуля,
   завершенное хотя бы одним байтом со значением 00.
   Версия кодофайла имеет внутрисистемное значение и изменяется
   только в случае существенных изменений в модуле Code
   с целью проконтролировать перекомпиляцию всех кодофайлов.
   (Загрузчик отказывается грузить кодофайлы с устаревшей версией).
   Версия изменяется с оповещением всех разработчиков зависящих от
   структруры кодофайла SoftWare.
   Текущая версия существенно не изменялась с 15 ноября 1985 года.
*)


TYPE CodeAtr = (
     (*0      1       2      3       4        5       6   *)
       Vers,  DefT,   ImpT,  StrSz,  CodeSz,  Stk0,   StkSz
     (*7      8       9      0A      0B       0C          *)
      ,GloSz, NoExt,  NoPrc, SymOfs, XrefOfs, Kind
     (*0D        0E       0F    *)
      ,StrAdr,   CodeAdr, ExtAdr  (* for Read only *)
);

PROCEDURE GetCatr(Code: ADDRESS; Atr: CodeAtr): WORD;
(* Выдает значение соответствующего атрибута кодофайла.
   Используется компиляторами и загрузчиком.
*)

PROCEDURE SetCatr(Code: ADDRESS; Atr: CodeAtr; Val: WORD);
(* Устанавливает значение соответствующего атрибута кодофайла.
   Используется компиляторами.
*)

PROCEDURE GetCode(Entry: ADDRESS): ADDRESS;
(* По адресу входа глобальной области модуля в таблицу глобальных
   областей выдает указатель на его кодовый сегмент.
   Используется загрузчиком.
*)

PROCEDURE MustBeInit(Entry: ADDRESS): BOOLEAN;
(* Требование на инициализацию данного модуля перед выполнением
   головного модуля программы. Если оно выставлено, загрузчик
   обеспечивает такую инициализацию.
*)

PROCEDURE ModuleName(Entry: ADDRESS): ADDRESS;
(* По адресу входа выдает имя модуля.
   Используется модулем LIB_HIS, процедурой History и
   модулем LIB_TWI, процедурой MyHost.
*)

PROCEDURE Default(Code: ADDRESS);
(* Выставляет значения всех атрибутов, по умолчанию.
   Используется компиляторами для инициализации области атрибутов кодофайла.
*)
 
PROCEDURE Kind?(C: ADDRESS; VAR S: ARRAY OF CHAR);
(* Выдает значение атрибута Kind *)
 
PROCEDURE SetKind(C: ADDRESS; VAR S: ARRAY OF CHAR);
(* Устанавливает значение атрибута Kind *)

END Code.
